﻿namespace Devonline.AspNetCore;

/// <summary>
/// 附件及文件操作类服务
/// </summary>
public interface IFileService
{
    /// <summary>
    /// 从 fileName 获取文件扩展名为 extension 的同名文件
    /// </summary>
    /// <param name="fileName">原始文件名</param>
    /// <param name="extension">文件扩展名</param>
    /// <returns></returns>
    string GetSameFileName(string fileName, string? extension = default);
    /// <summary>
    /// 获取附件绝对地址
    /// </summary>
    /// <param name="fileName">附件文件名</param>
    /// <returns></returns>
    string GetAttachmentPath(string fileName);
    /// <summary>
    /// 获取随机的临时文件名
    /// </summary>
    /// <param name="extension"></param>
    /// <returns></returns>
    string GetTempFileName(string? extension = default);
    /// <summary>
    /// 根据文件名获取 ContentType
    /// </summary>
    /// <param name="fileName"></param>
    /// <returns></returns>
    string GetContentType(string fileName);

    /// <summary>
    /// 从文件名获取文件绝对地址, 如果文件名是来自互联网的路径, 则下载并保存到本地在返回
    /// </summary>
    /// <param name="fileName">相对文件名或互联网路径</param>
    /// <returns></returns>
    Task<string?> GetFileAsync(string fileName);
    /// <summary>
    /// 从互联网下载文件到保存到本地临时文件
    /// </summary>
    /// <param name="fileName">互联网完全文件名</param>
    /// <returns></returns>
    /// <exception cref="FileLoadException"></exception>
    Task<string> DownloadAsync(string fileName);

    /// <summary>
    /// 压缩文件/文件夹, 之后执行委托方法
    /// </summary>
    /// <param name="filePath">文件/文件夹路径</param>
    string Compress(string filePath, Action<string>? action = default);

    /// <summary>
    /// 删除附件物理文件, 请在附件相关操作的事物提交之后执行此方法
    /// </summary>
    /// <param name="fileName">待删除的文件</param>
    void Delete(string fileName);
    /// <summary>
    /// 删除附件物理文件, 请在附件相关操作的事物提交之后执行此方法
    /// </summary>
    /// <param name="fileNames">待删除的文件</param>
    void Delete(params string[] fileNames);

    /// <summary>
    /// 销毁文件, 如果销毁, 此接口将性能不好且文件则无法找回
    /// 销毁附件物理文件, 请在附件相关操作的事物提交之后执行此方法
    /// </summary>
    /// <param name="fileName">待销毁的文件</param>
    Task DestoryAsync(string fileName);
    /// <summary>
    /// 销毁文件, 如果销毁, 此接口将性能不好且文件则无法找回
    /// 销毁附件物理文件, 请在附件相关操作的事物提交之后执行此方法
    /// </summary>
    /// <param name="fileNames">待销毁的文件</param>
    Task DestoryAsync(params string[] fileNames);
    /// <summary>
    /// 销毁文件, 销毁后的文件不可还原
    /// </summary>
    /// <param name="fileName">要销毁的文件名</param>
    /// <param name="filler">默认填充符, 默认: 0x00</param>
    /// <param name="delete">是否删除, 默认: 是</param>
    /// <returns></returns>
    Task DestoryAsync(string fileName, byte filler = 0x00, bool delete = true);
}